6

I am trying RPC request to bitcoind node,using Kotlin. My code looks like

import khttp.delete as httpDelete
val node_url = "http://rpcusr:[email protected]:18443"
val json_resp =  khttp.post(url = node_url,
                            headers = mapOf("Content-Type" to "application/json"),  //also tried application.json and text/plain
                            json = mapOf("id" to "curltext","jsonrpc" to 1,"method" to "getblockchaininfo","params" to arrayOf("")))
println(json_resp.text)

and its output -->

<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=ISO-8859-1'>
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>

bitcoin.conf -->

rpcuser=rpcusr
rpcpassword=rpcpass
rpcallowip=0.0.0.0/0
server=1

Using curl i am getting desired output

CURL command-->

curl -v --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getblockchaininfo", "params": [] }' -H 'content-type: text/plain;' http://abc:[email protected]:18443

o/p -->

{"result":{"chain":"regtest","blocks":0,"headers":0,"bestblockhash":"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206","difficulty":4.656542373906925e-10,"mediantime":1296688602,"verificationprogress":1,"initialblockdownload":true,"chainwork":"0000000000000000000000000000000000000000000000000000000000000002","size_on_disk":293,"pruned":false,"softforks":[{"id":"bip34","version":2,"reject":{"status":false}},{"id":"bip66","version":3,"reject":{"status":false}},{"id":"bip65","version":4,"reject":{"status":false}}],"bip9_softforks":{"csv":{"status":"defined","startTime":0,"timeout":9223372036854775807,"since":0},"segwit":{"status":"active","startTime":-1,"timeout":9223372036854775807,"since":0}},"warnings":""},"error":null,"id":"curltest"}

The reason why i am asking this question on this forum is, i took the same approach to get rpc response from Ethereum node and i am getting proper response,the error is occuring only with bitcoin & litecoin node

Any clue why it is behaving this way ?

4
  • mapOf("Contenet-Type" to "application.json"),. Try changing that to Content-Type. If it still doesn't work, try application/json as well. Commented Jun 19, 2018 at 20:08
  • didnt work with any of the combination . Response is same in all cases Commented Jun 19, 2018 at 20:53
  • Can you post the relevant bitcoind debug.log output? That may have some clues
    – chytrik
    Commented Jun 20, 2018 at 20:31
  • debug.log only shows blocks being downloaded and nothing relevant Commented Jun 21, 2018 at 7:16

2 Answers 2

1

You are not properly sending the authentication headers. From a quick reading of the documentation, you need to add auth=BasicAuthorization("rpcuser", "rpcpass") to your post request because the URL http://rpcusr:[email protected]:18443" is not sufficient for khttp to send the basic authentication headers.

1

We need to pass Authorization method as :

val jsonstring = khttp.post(
        url = node_url,
        headers = mapOf("Authorization" to computeBasicAuth("abc","pass")),
        data = JSONObject("{\"jsonrpc\": \"1.0\", \"id\":\"curltest\", \"method\": \"getrawmempool\", \"params\": [] }")
)

where:

fun computeBasicAuth(user: String, password: String) ="Basic ${BASE64.encodeToString("$user:$password".toByteArray())}"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.