5

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

import khttp.delete as httpDelete
val node_url = "http://rpcusr:rpcpass@127.0.0.1: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:pass@127.0.0.1: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 ?

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

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:rpcpass@127.0.0.1:18443" is not sufficient for khttp to send the basic authentication headers.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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